﻿#include "serverfile.h"
#include "ui_serverfile.h"
#include<QMessageBox>

Serverfile::Serverfile(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Serverfile)
{
    ui->setupUi(this);

    tcpserver=NULL;
    tcpsocket=NULL;

    //监听套接字
    tcpserver =new QTcpServer(this);

    //监听绑定
    tcpserver->listen(QHostAddress::Any,9999);
    setWindowTitle(QString::fromLocal8Bit("服务器文件接收"));
    this->setWindowIcon(QIcon(":/photo/11.jfif"));

    //开始两个按钮都不能按
    ui->sendButton->setEnabled(false);
    ui->chooseButton->setEnabled(false);

    //如果连接成功，tcpserver会触发new connect（）；

    connect(tcpserver,&QTcpServer::newConnection,[=](){

        //取出建立好连接的套接字
        tcpsocket= tcpserver->nextPendingConnection();

        //获取对方ip和端口
        QString ip=tcpsocket->peerAddress().toString();
        quint16 port =tcpsocket->peerPort();

        QString str=QString(QString::fromLocal8Bit("文件传输与服务器成功连接"));
        ui->readtext->setText(str);

        //连接成功后按钮可以显示
        ui->chooseButton->setEnabled(true);
    });

    connect(&timer,&QTimer::timeout,[=](){

        //关闭定时器
        timer.stop();
        sendfile();

    });

}

Serverfile::~Serverfile()
{
    delete ui;
}

//发送文件
void Serverfile::sendfile()
{
    qint64 len=0;
    do{
        char buf[4*1024]={0};  //每次发送4kb
        len=0;
        //往文件中读数据
        len=file.read(buf,sizeof(buf));
        //发送数据，读多少，发多少
        len=tcpsocket->write(buf,len);
        //发送的数据需要累加
        sendsize+=len;

    }while(len>0);

    //是否发送文件完毕判断
    if(sendsize==filesize){

      // ui->readtext->append("文件发送完毕");
        QMessageBox::information(NULL,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit(" 文件发送完毕 "));
        file.close();

        //客户端断开
        tcpsocket->disconnectFromHost();
        tcpsocket->close();
    }
}


//选择文件按钮
void Serverfile::on_chooseButton_clicked()
{
    QString filePath= QFileDialog::getOpenFileName(this,"open","../");
    if(filePath.isEmpty()==false){
        filename.clear();
        filesize=0;
        //获取文件信息
        QFileInfo info(filePath);
        filename=info.fileName();//获取文件名
        filesize=info.size();//获取文件大小
        sendsize=0; //发送文件的大小


        //以只读方式打开文件 指定文件的名字
        file.setFileName(filePath);
        bool isok=file.open(QIODevice::ReadOnly);

        if(isok==false){
            qDebug()<<"以只读的方式打开文件失败";
        }

        ui->chooseButton->setEnabled(false);
        ui->sendButton->setEnabled(true);
    }

    else {
        qDebug()<<"选择文件出错";
    }

}

//发送文件按钮
void Serverfile::on_sendButton_clicked()
{
    //先发送文件头信息，后发送真正文件信息内容
    QString head= QString("%1##%2").arg(filename).arg(filesize);
    //发送头部信息
    qint64 len= tcpsocket->write(head.toUtf8());
    if(len>0){
        //保证头先发送后面才能发送
        //防止tcp黏包 需要定时后发送
        timer.start(50);
    }
    else{
        file.close();
        ui->chooseButton->setEnabled(true);
        ui->sendButton->setEnabled(false);
    }
}

